/**************************************************
 *
 * This file contains an interrupt vector 
 * Herzog. (Cortex-M written in C)
 * The actual interrupt functions must be provided 
 * by the application developer.
 *
 * Copyright 2007 IAR Systems. All rights reserved.
 *
 * $Revision: 2024 $
 *
 **************************************************/

#pragma language=extended
#pragma segment="CSTACK"

extern void __iar_program_start( void );

extern void NMI_Handler( void );    // NMI Handler
extern void HardFault_Handler( void );    // Hard Fault Handler
extern void SVC_Handler( void );    // SVCall Handler
extern void PendSV_Handler( void );   // PendSV Handler
extern void SysTick_Handler( void );   // SysTick Handler
extern void Wakeup_Handler( void );     // irq  0
extern void GPIO_Handler( void );       // irq  1
extern void Brownout_Handler( void );   // irq  2
extern void VBAT_Handler( void );       // irq  3
extern void WatchdogA_Handler( void );  // irq  4
extern void LIN_Master_Handler( void ); // irq  5
extern void LIN_Slave_Handler( void );  // irq  6
extern void UART_Handler( void );       // irq  7
extern void ADC_Handler( void );        // irq  8
extern void PWM_Handler( void );        // irq  9
extern void Buck_Handler( void );       // irq 10
extern void Lullaby_Handler( void );   // irq 15
extern void Timer0_Handler( void );     // irq 16
extern void Timer1_Handler( void );     // irq 17
extern void Timer2_Handler( void );     // irq 18
extern void WatchdogM_Handler( void );  // irq 19
extern void BTE_Handler( void );        // irq 20
extern void SDIO_Handler( void );       // irq 21
extern void Default_IRQHandler( void ); // <No hardware implemented>


typedef void( *intfunc )( void );
typedef union { intfunc __fun; void * __ptr; } intvec_elem;

// The vector table is normally located at address 0.
// When debugging in RAM, it can be located in RAM, aligned to at least 2^6.
// If you need to define interrupt service routines,
// make a copy of this file and include it in your project.
// The name "__vector_table" has special meaning for C-SPY:
// it is where the SP start value is found, and the NVIC vector
// table register (VTOR) is initialized to this address if != 0.

#pragma location = ".intvec"
const intvec_elem __vector_table[] =
{
    { .__ptr = __sfe( "CSTACK" ) },
    __iar_program_start,    // Reset Handler
    NMI_Handler,    // NMI Handler
    HardFault_Handler,    // Hard Fault Handler
    0,                               // Reserved
    0,                               // Reserved
    0,                               // Reserved
    0,                               // Reserved
    0,                               // Reserved
    0,                               // Reserved
    0,                               // Reserved
    SVC_Handler,    // SVCall Handler
    0,                               // Reserved
    0,                               // Reserved
    PendSV_Handler,     // PendSV Handler
    SysTick_Handler,    // SysTick Handler
    Wakeup_Handler,     // irq 0
    GPIO_Handler,       // irq 1
    Brownout_Handler,   // irq 2
    VBAT_Handler,       // irq 3
    WatchdogA_Handler,  // irq 4
    LIN_Master_Handler, // irq 5
    LIN_Slave_Handler,  // irq 6
    UART_Handler,       // irq 7
    ADC_Handler,        // irq 8
    PWM_Handler,        // irq 9
    Buck_Handler,       // irq 10
    Default_IRQHandler, // irq 11
    Default_IRQHandler, // irq 12
    Default_IRQHandler, // irq 13
    Default_IRQHandler, // irq 14
    Lullaby_Handler,    // irq 15
    Timer0_Handler,     // irq 16
    Timer1_Handler,     // irq 17
    Timer2_Handler,     // irq 18
    WatchdogM_Handler,  // irq 19
    BTE_Handler,        // irq 20
    SDIO_Handler,       // irq 21
};

__weak void NMI_Handler( void ) { while (1) {} }    // NMI Handler
__weak void HardFault_Handler( void ) { while (1) {} }    // Hard Fault Handler
__weak void SVC_Handler( void ) { while (1) {} } // SVCall Handler
__weak void PendSV_Handler( void ) { while (1) {} }   // PendSV Handler

__weak void SysTick_Handler( void )  {}   // SysTick Handler

__weak void Wakeup_Handler( void ) {}           // irq  0
__weak void GPIO_Handler( void ) {}             // irq  1
__weak void Brownout_Handler( void ) {}         // irq  2
__weak void VBAT_Handler( void ) {}             // irq  3
__weak void WatchdogA_Handler( void ) {}        // irq  4
__weak void LIN_Master_Handler( void ) {}       // irq  5
__weak void LIN_Slave_Handler( void ) {}        // irq  6
__weak void UART_Handler( void ) {}             // irq  7
__weak void ADC_Handler( void ) {}              // irq  8
__weak void PWM_Handler( void ) {}              // irq  9
__weak void Buck_Handler( void ) {}             // irq 10
__weak void Lullaby_Handler( void ) {}          // irq 15
__weak void Timer0_Handler( void ) {}           // irq 16
__weak void Timer1_Handler( void ) {}           // irq 17
__weak void Timer2_Handler( void ) {}           // irq 18
__weak void WatchdogM_Handler( void ) {}        // irq 19
__weak void BTE_Handler( void ) {}              // irq 20
__weak void SDIO_Handler( void ) {}             // irq 21
__weak void Default_IRQHandler( void ) {}       // <No hardware implemented>


void __cmain( void );
__weak void __iar_init_core( void );
__weak void __iar_init_vfp( void );

#pragma required=__vector_table
void __iar_program_start( void )
{
  __iar_init_core();
  __iar_init_vfp();
  __cmain();
}
